home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 359_11 / patch5.000 / GO32_NPX.ASM < prev    next >
Assembly Source File  |  1991-09-11  |  3KB  |  185 lines

  1. ; This is file NPX.ASM
  2. ;
  3. ; Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
  4. ;
  5. ; This file is distributed under the terms listed in the document
  6. ; "copying.dj", available from DJ Delorie at the address above.
  7. ; A copy of "copying.dj" should accompany this file; if not, a copy
  8. ; should be available from where this file was obtained.  This file
  9. ; may not be distributed without a verbatim copy of "copying.dj".
  10. ;
  11. ; This file is distributed WITHOUT ANY WARRANTY; without even the implied
  12. ; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. ;
  14.  
  15. ;    History:69,29
  16.     title    tables
  17.     .386p
  18.  
  19.     include build.inc
  20.     include    segdefs.inc
  21.     include tss.inc
  22.     include gdt.inc
  23.     include idt.inc
  24.  
  25. son    macro
  26.     mov    al,33h
  27.     out    61h,al
  28.     endm
  29.  
  30. soff    macro
  31.     mov    al,30h
  32.     out    61h,al
  33.     endm
  34.  
  35. ;------------------------------------------------------------------------
  36.  
  37.     start_data16
  38.  
  39.     extrn    _npx:byte
  40.     extrn    ivec_number:byte
  41.  
  42.     public    _npx_stored
  43. _npx_stored    db    0        ; 0=in 387, 1=in _npx
  44.  
  45. temp87    dw    1 dup (?)
  46.  
  47.     end_data16
  48.  
  49. ;------------------------------------------------------------------------
  50.  
  51.     start_code16
  52.  
  53. ;------------------------------------------------------------------------
  54.  
  55.     public    _detect_80387        ; direct from the Intel manual
  56. _detect_80387:                ; returns 1 if 387, else 0
  57.     fninit
  58.     mov    si,offset dgroup:temp87
  59.     mov    word ptr [si],5a5ah
  60.     fnstsw    [si]
  61.     cmp    byte ptr [si],0
  62.     jne    no_387
  63.  
  64.     fnstcw    [si]
  65.     mov    ax,[si]
  66.     and    ax,103fh
  67.     cmp    ax,3fh
  68.     jne    no_387
  69.  
  70.     fld1
  71.     fldz
  72.     fdiv
  73.     fld    st
  74.     fchs
  75.     fcompp
  76.     fstsw    [si]
  77.     mov    ax,[si]
  78.     sahf
  79.     je    no_387
  80.     fninit            ; 387 present, initialize.
  81.     fnstcw    temp87
  82.     wait
  83.     and    temp87,0fffah    ; enable invalid operation exception
  84.     fldcw    temp87
  85.     mov    ax,1
  86.     ret
  87.  
  88. no_387:
  89.     mov    ax,0
  90.     ret
  91.  
  92. ;------------------------------------------------------------------------
  93.  
  94.     public    _ivec7
  95. _ivec7:
  96.     push    eax
  97.     mov    eax,cr0
  98.     and    eax,0FFFFFFF3h
  99.     mov    cr0,eax
  100.     pop    eax
  101.     iretd
  102.  
  103.     public    _fclex        ; for either mode
  104. _fclex:
  105.     in    al,0a0h
  106.     test    al,20h
  107.     jz    fclex_ret
  108.     or    ax,ax
  109.     out    0f0h,al
  110.     mov    al,20h
  111.     out    0a0h,al
  112.     out    20h,al
  113. fclex_ret:
  114.     ret
  115.  
  116.     public    _ivec75
  117. _ivec75:
  118.     push    ax
  119.     push    ds
  120.  
  121.     push    g_core
  122.     pop    ds
  123.     inc    word ptr ds:[0b8004h]
  124.  
  125.     push    g_rdata
  126.     pop    ds
  127.     mov    _npx_stored,1
  128.     or    ax,ax
  129.     out    0f0h,al
  130.     mov    al,20h
  131.     out    0a0h,al
  132.     out    20h,al
  133. ;    fnsave    ds:[_npx]
  134.     db    66h,67h,0ddh,35h
  135.     dd    offset _npx
  136.     fwait
  137.  
  138.     mov    ivec_number,75h
  139.     pop    ds
  140.     pop    ax
  141.     db    0eah
  142.     dw    0, g_itss
  143.  
  144. ;------------------------------------------------------------------------
  145.  
  146.     public    __do_save_npx
  147. __do_save_npx:
  148.     cmp    _npx_stored,0
  149.     jne    fpsave_ret
  150.     call    _fclex
  151.     mov    _npx_stored,1
  152. ;    fnsave    ds:[_npx]
  153.     db    66h,67h,0ddh,35h
  154.     dd    offset _npx
  155.     fwait
  156. fpsave_ret:
  157.     jmpt    g_ctss
  158.  
  159.     public    __do_load_npx        ; from *protected* mode
  160. __do_load_npx:
  161.     cmp    _npx_stored,0
  162.     je    no_load_npx
  163.     call    _fclex
  164.     mov    _npx_stored,0
  165.     mov    _npx[4],0        ; clear pending exceptions
  166. ;    frstor    [_npx]
  167.     db    66h,67h,0ddh,25h
  168.     dd    offset _npx
  169. no_load_npx:
  170.     ret
  171.  
  172. ;------------------------------------------------------------------------
  173.  
  174.     end_code16
  175.  
  176. ;------------------------------------------------------------------------
  177.  
  178.     start_code32
  179.  
  180.     end_code32
  181.  
  182. ;------------------------------------------------------------------------
  183.  
  184.     end
  185.